package logica.persistencia;

import java.util.List;

import org.jdom.Element;

import vista.objetos.RelacionGraficable;
import xml.ConstantesXml;
import xml.XMLManager;
import logica.Atributo;
import logica.AtributoRepetidoException;
import logica.EntidadRol;
import logica.Relacion;
import logica.TipoDeRelacion;

public class RelacionPersistente extends ObjetoDiagramaPersistente {
		
	public RelacionPersistente(Relacion relacion) {
		super(relacion);
	}
	

	public RelacionPersistente(RelacionGraficable relacionGraficable) {
		super(relacionGraficable);
	}


	@Override
	public void serializar() {
		Element elementoRelacion = new Element (ConstantesXml.ELEMENTO_RELACION);
		Relacion relacion  = (Relacion) this.getObjetoDiagrama();
		super.serializarElementoGenerico(elementoRelacion);
		elementoRelacion.setAttribute(ConstantesXml.ATRIBUTO_NOMBRE, relacion.getNombre());
		elementoRelacion.setAttribute(ConstantesXml.ATRIBUTO_TIPO, String.valueOf(relacion.getTipo()));
		
		
		//elementoRelacion.setAttribute(ConstantesXml.ATRIBUTO_TIPO, relacion.getTipo());
		
		
		if (relacion.getAtributos().size() > 0) {
			Element listaAtributos = new Element (ConstantesXml.LISTA_ATRIBUTOS);	
			for (Atributo atributo : relacion.getAtributos()) {
				AtributoPersistente atrP = atributo.getAtributoPersistente(); 
				atrP.setPadre(listaAtributos);
				atrP.serializar();
			}
			elementoRelacion.addContent(listaAtributos);
				
		}
		
		if (relacion.getEntidades().size() > 0) {
			Element listaEntidadesRol = new Element (ConstantesXml.LISTA_ENTIDAD_ROL);
			for (EntidadRol entidadRol : relacion.getEntidades()) {
				EntidadRolPersistente entRolP = entidadRol.getEntidadRolPersistente();
				entRolP.setPadre(listaEntidadesRol);
				entRolP.serializar();
			}
			elementoRelacion.addContent(listaEntidadesRol);
			
		}
		XMLManager.getInstance().agregarElementoAObjetos(elementoRelacion);
		
		
	}
	
	
	public void hidratarAtributos(Element elementoRelacion){
		Element listaAtributos = elementoRelacion.getChild(ConstantesXml.LISTA_ATRIBUTOS);
		Relacion relacion = (Relacion)this.getObjetoDiagrama();
		if (listaAtributos != null) {
			@SuppressWarnings("unchecked")
			List <Element> elementListaAtributosSimples = listaAtributos.getChildren(ConstantesXml.ELEMENTO_ATRIBUTO_SIMPLE);
			List <Atributo> listaAtribSimples = AtributoSimplePersistente.hidratarListaAtributosSimples(elementListaAtributosSimples);
			try {
				relacion.agregarAtributos(listaAtribSimples);
			} catch (AtributoRepetidoException e) {
				e.printStackTrace();
			}
			
			@SuppressWarnings("unchecked")
			List <Element> elementListaAtributosCompuestos = listaAtributos.getChildren(ConstantesXml.ELEMENTO_ATRIBUTO_COMPUESTO);
			List <Atributo> listaAtribCompuestos = AtributoCompuestoPersistente.hidratarListaAtributosCompuestos(elementListaAtributosCompuestos);
			try {
				relacion.agregarAtributos(listaAtribCompuestos);
			} catch (AtributoRepetidoException e) {
				e.printStackTrace();
			}
		}
	
	}
	
	public void hidratar(Element elementoRelacion) {
		//Hasheo el elemento para poder obtenerlo después a través del id
		String claveHash = elementoRelacion.getAttributeValue(ConstantesXml.ATRIBUTO_ID_OBJETO);
		XMLManager.getInstance().hashObjetoDiagramaConClave(claveHash, this.getObjetoDiagrama());
		
		TipoDeRelacion tipo = TipoDeRelacion.valueOf(elementoRelacion.getAttributeValue(ConstantesXml.ATRIBUTO_TIPO));
		Relacion relacion = (Relacion)this.getObjetoDiagrama();
		relacion.setTipo(tipo);
		
		this.hidratarAtributos(elementoRelacion);
		
	}
	
	

}
